Dockerのbuild cache
なんか異様に文章が分かりづらい
前提を知らなすぎるだけかもしれない
Dockerのbuild時のcache
DockerfileからDocker Imageを作成する際にcacheを保存し、buildを高速化する
cacheの仕組み
各image layerの内容を元にhash値を計算する
layerの内容が変わるとhash値も変わる
build時に、前回のhash値と一致するかどうかでcacheを使うかどうかを決定する
cacheの利用条件
以下の条件を満たす場合にキャッシュを使用しますGPT-4.icon
そのステップの命令が変更されていない。
そのステップで使用されるファイルやディレクトリが変更されていない。
そのステップの前のステップの結果がキャッシュされている。
cacheが使えない以降のlayerは全部cacheが破棄される
https://gyazo.com/f7eee668141c4426497343ef869ab620 https://docs.docker.jp/build/guide/layers.html
例えば、こういう順序でdockerfileを書いてしまうと、
code:dockerfile
COPY src src
RUN npm install
src/の内容を編集して、docker buildするたびに、npm installが再実行されて遅い
code:dockerfile
FROM node:16
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
このDockerfileでは、以下のようにキャッシュが利用されます
1. **FROM node:16**:
このレイヤーは常にキャッシュされます。基本イメージが変更されない限り、再利用されます。
2. **WORKDIR /app
作業ディレクトリを設定する命令もキャッシュされます。
3. **COPY package.json package-lock.json ./
これらのファイルが変更されない限り、このステップはキャッシュされます。
4. **RUN npm install
package.jsonやpackage-lock.jsonが変更されない場合、npm installの結果はキャッシュされます。これにより、依存関係が再インストールされることはありません。
5. **COPY . .
アプリケーションのソースコードを全てコピーします。このステップが実行されると、後続のステップはキャッシュされなくなります。
6. **CMD ["node", "index.js"]
最後に、アプリケーションを実行するコマンドを指定します。このコマンドはキャッシュの対象ではありません。
そうなんだmrsekut.icon
キャッシュを無効化する方法
場合によっては、キャッシュを無効化したいこともあります。以下の方法でキャッシュを無効化できます:
- **--no-cacheオプション**:
`bash
docker build --no-cache -t myapp .
`
このオプションを使用すると、すべてのステップを再実行し、キャッシュを使用しません。
- **ファイルを変更**:
- 依存関係のファイル(例: package.json)を変更することで、関連するレイヤーのキャッシュを無効化できます。